/**
 * 项目名称：点亮2个LED
 * 单片机：STC8G1K08
 * 频率：11.0592Mhz
 * PCB:1603120A_Y3
 * 学习目标：使用同一个8bit变量表达至少2个led的状态，
 * 在不影响其他IO的情况下改变指定IO电平，
 * 继续理解“位”以及位运算的使用
 * 
 * 操作：P3组IO，使LED4  P3.4 与 LED3  P3.5 闪烁，即：P3的4和5，并使LED1(P3.6)常亮，其他端口为输入
  */

#include "stc8g.h" //加载此头文件以后不需要再加载reg51.h

unsigned char ledState; //led状态

//软件延时函数@11.0592MHz 本小节不必理会其原理
void Delay500ms() {
    unsigned char i, j, k;

    i = 29;
    j = 14;
    k = 54;
    do {
        do {
            while (--k);
        } while (--j);
    } while (--i);
}

void main() {
    //将不使用的IO配置为输入状态
    P3M1 = 0x8F; //0x00 二进制值为 1000 1111
    P3M0 = 0x70; //0x60 二进制值为 0111 0000
    P3 = 0xFF;
    while(1) {
        ledState = P3; //将P3的8个IO状态读入变量中

        //想想执行下面这步会发生什么，P3口的状态将会时什么样（xxxx xxxx）
        //改变P3整组IO的状态，而不是类似P35=1的这种操作
        P3 = ledState | (0x03 << 4); 
        Delay500ms();

        ledState = P3;
        //同理，下面这步执行完成后，P3口的状态是什么样的，可以找张纸做一下位运算
        //~是按位取反，即：0101 1111 会变成 1010 0000 有关位运算可查阅相关资料自学
        
        P3 = ledState & ~(0x03 << 4); //位运算不管多么复杂，对于单片机来说都是比较节省资源的
        Delay500ms();
    }
}
